package com.zlp.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    /** 
     * 认证管理器配置
     * @param auth
     * @date: 2021/3/11 17:39
     * @return: void 
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.
                // 使用内存中的 InMemoryUserDetailsManager
                        inMemoryAuthentication()
                // 不使用 PasswordEncoder 密码编码器
                .passwordEncoder(NoOpPasswordEncoder.getInstance())
                .withUser("root").password("root").roles("ADMIN","NORMAL")
                // 配置 admin 用户
                .and().withUser("admin").password("admin").roles("ADMIN")
                // 配置 normal 用户
                .and().withUser("normal").password("normal").roles("NORMAL");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                // 配置请求地址的权限
                .authorizeRequests()
                // 所有用户可访问,不需要登入
                .antMatchers("/test/echo").permitAll()
                // 需要 ADMIN 角色
                .antMatchers("/test/admin","/test/getUserInfo").hasRole("ADMIN")
                // 需要 NORMAL 角色
                .antMatchers("/test/normal","/test/getUserInfo").access("hasRole('NORMAL')") // 需要 NORMAL 角色。
                // 任何请求，访问的用户都需要经过认证
                .anyRequest()
                .authenticated()
                .and()
                // 设置 Form 表单登陆
                .formLogin()
                //.loginPage("/login") // 登陆 URL 地址
                .permitAll() // 所有用户可访问
                .and().logout()
                // .logoutUrl("/logout") // 退出 URL 地址
                // 所有用户可访问
                .permitAll()
                // 禁用跨域
                .and().csrf().disable();
    }
}
